from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from sqlalchemy.sql.functions import user

from info import constants
from info import db
from info.models import Category, News, User
from info.utils import image_storage
from info.utils.commoms import user_login_data
from info.utils.response_code import RET
from . import profile_blu


#  获取作者发布的文章列表
@profile_blu.route('/other_news_list')
@user_login_data
def other_news_list():

    #  获取参数
    p=request.args.get('p',1)
    user_id=request.args.get('user_id')

    if not user_id:
        return jsonify(errno=RET.NODATA, errmsg='没有该用户')

    #  转换类型
    try:
        p=int(p)
    except Exception as e:
        current_app.logger.error(e)
        p=1
        return jsonify(errno=RET.DATAERR, errmsg='参数转换失败')

    #  获取作者对象,为了方便查询
    try:
        author=User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='作者查询失败')

    if not author:
        return jsonify(errno=RET.DATAERR, errmsg='没有该作者')

    #  分页查询
    try:
        paginate=author.news_list.order_by(News.create_time.desc()).paginate(p,1,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='分页查询失败')

    #  获取分页对象属性
    totalPage=paginate.pages
    currentPage=paginate.page
    items=paginate.items

    #  将对象列表转换成字典
    items_list=[]
    for item in items:
        items_list.append(item.to_dict())

    data={
        'total_page':totalPage,
        'current_page':currentPage,
        'news_list':items_list
    }

    return jsonify(errno=RET.OK, errmsg='ok', data=data)


#  获取作者详情信息
@profile_blu.route('/other')
@user_login_data
def other_info():
    #  获取参数
    author_id = request.args.get('id')
    #  校验参数
    if not author_id:
        return jsonify(errno=RET.DATAERR, errmsg='参数不全')
    # 根据id查询作者
    try:
        author = User.query.get(author_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.NODATA, errmsg='用户查询异常')

    if not author:
        return jsonify(errno=RET.NODATA, errmsg='没有找到该作者')

    #  判断用户是否关注
    is_followed = False
    #  判断用户是否登陆，判断新闻是否有作者
    if g.user:
        if g.user in author.followers:
            is_followed = True

    # 拼接作者信息
    data = {
        'author_info': author.to_dict(),
        'is_followed':is_followed,
        'user_info':g.user.to_dict() if g.user else ''
    }

    return render_template('news/other.html', data=data)


#  我的关注列表展示
@profile_blu.route('/user_follow')
@user_login_data
def user_follow():
    #  获取页数
    p = request.args.get('p', 1)

    #  转换类型
    try:
        p = int(p)
    except Exception as e:
        current_app.logger.error(e)
        p = 1
        return jsonify(errno=RET.DATAERR, errmsg='类型转换失败')

    # 分页查询
    try:
        paginate = g.user.followed.paginate(p, 1, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='分页查询失败')

    # 获取分页对象属性
    totalpage = paginate.pages
    currentpage = paginate.page
    items = paginate.items

    #  将对象列表转换成字典
    items_list = []
    for item in items:
        items_list.append(item)

    data = {
        'totalPage': totalpage,
        'currentPage': currentpage,
        'items_list': items_list,
        # 'user_info':g.user.to_dict(),
    }

    #  返回数据
    return render_template('news/user_follow.html', data=data)


#  新闻发布列表展示
"""
请求路径: /user/news_list
请求方式:GET
请求参数:p
返回值:GET渲染user_news_list.html页面
"""""


@profile_blu.route('/news_list')
@user_login_data
def news_list():
    #  获取请求参数
    p = request.args.get('p', 1)
    #  转换类型
    try:
        p = int(p)
    except Exception as e:
        current_app.logger.error(e)
        p = 1
        return jsonify(errno=RET.DBERR, errmsg='转换失败')

    # 分页查询
    try:
        paginate = g.user.news_list.order_by(News.create_time.desc()).paginate(p, 7, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='分页查询失败')

    # 获取分页对象的属性
    totalpage = paginate.pages
    currentpage = paginate.page
    items = paginate.items

    #  将内容对象转换成字典对象
    news_list = []
    for item in items:
        news_list.append(item.to_review_dict())

    # 拼接数据返回
    data = {
        'totalPage': totalpage,
        'currentPage': currentpage,
        'news_list': news_list,
    }

    #  返回数据
    return render_template('news/user_news_list.html', data=data)



#  用户发布新闻
"""
请求路径: /user/news_release
请求方式:GET,POST
请求参数:GET无, POST ,title, category_id,digest,index_image,content
返回值:GET请求,user_news_release.html, data分类列表字段数据, POST,errno,errmsg

"""""

@profile_blu.route('/news_release', methods=['GET', 'POST'])
@user_login_data
def news_release():
    #  第一次进来是get请求
    if request.method == 'GET':
        #  查询分类信息
        try:
            categories = Category.query.all()
            #  弹出最新信息
            categories.pop(0)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg='分类查询失败')

        # 转换成字典，渲染到页面
        categories_list = []
        for item in categories:
            categories_list.append(item.to_dict())

        data = {
            'categories_list': categories_list
        }
        return render_template('news/user_news_release.html', data=data)

    #

    #  获取参数
    title = request.form.get('title')
    category_id = request.form.get('category_id')
    digest = request.form.get('digest')
    image_data = request.files.get('index_image')
    content = request.form.get('content')

    #  检验参数
    if not all([title, category_id, digest, image_data, content]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')

    # 读取图片，上传文件到七牛云
    try:
        image_name = image_storage.image_storage(image_data.read())
        if not image_name:
            return jsonify(errno=RET.DBERR, errmsg='图片上传失败')
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='七牛云异常')

    # 创建新闻对象,并设置属性
    news = News()
    news.title = title
    news.source = '个人发布'
    news.digest = digest
    news.category_id = category_id
    news.index_image_url = constants.QINIU_DOMIN_PREFIX + image_name
    news.content = content
    news.user_id = g.user.id
    news.status = 1

    #  提交到数据库，如果是新增加的，就需要手动提交
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='数据库提交异常')

    # 返回数据
    return jsonify(errno=RET.OK, errmsg="发布成功，等待审核")


"""
请求路径: /user/ collection
请求方式:GET
请求参数:p(页数)
返回值: user_collection.html页面
"""""


#  新闻收藏
@profile_blu.route('/collection')
@user_login_data
def collection():
    #  获取参数
    p = request.args.get('p', 1)

    #  参数转换
    try:
        p = int(p)
    except Exception as e:
        current_app.logger.error(e)
        p = 1
        return jsonify(errno=RET.DBERR, errmsg="参数转换失败")

    # 分页查询
    try:
        paginate = g.user.collection_news.paginate(p, 1, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="分页查询失败")

    # 获取分页对象的属性
    totalpage = paginate.pages
    currentpage = paginate.page
    items = paginate.items

    #  转换成字典列表
    news_list = []
    for item in items:
        news_list.append(item.to_review_dict())

    data = {
        'totalPage': totalpage,
        'currentPage': currentpage,
        'news_list': news_list,
    }

    return render_template('news/user_collection.html', data=data)


"""
请求路径: /user/pass_info
请求方式:GET,POST
请求参数:GET无, POST有参数,old_password, new_password
返回值:GET请求: user_pass_info.html页面,
data字典数据, POST请求: errno, errmsg
"""""


#  密码修改
@profile_blu.route('/pass_info', methods=['GET', 'POST'])
@user_login_data
def pass_info():
    if request.method == 'GET':
        data = {
            'user_info': g.user.to_dict() if g.user else ''
        }

        return render_template('news/user_pass_info.html', data=data)

    # 获取参数
    old_password = request.json.get('old_password')
    new_password = request.json.get('new_password')

    #  为空校验
    if not all([old_password, new_password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')

    # 判断密码是否一致
    if not g.user.check_passowrd(old_password):
        return jsonify(errno=RET.PWDERR, errmsg="原密码错误")

    # 更新密码
    g.user.password = new_password

    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

    return jsonify(errno=RET.OK, errmsg="保存成功")


#  用户头像上传
"""
请求路径: /user/pic_info
请求方式:GET,POST
请求参数:无, POST有参数,avatar
返回值:GET请求: user_pci_info.html页面,data字典数据,
POST请求: errno, errmsg,avatar_url

"""""


@profile_blu.route('/pic_info', methods=['GET', 'POST'])
@user_login_data
def pic_info():
    if request.method == 'GET':
        data = {
            'user_info': g.user.to_dict() if g.user else ''
        }

        return render_template('news/user_pic_info.html', data=data)

    # 获取到上传的文件
    try:
        #  获取参数，图片
        avatar_file = request.files.get('avatar').read()
        #  校验参数
        if not avatar_file:
            return jsonify(errno=RET.DBERR, errmsg='图片不能为空')
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='读取文件出错')

    # 将文件上传到七牛云
    try:
        image_name = image_storage.image_storage(avatar_file)
        if not image_name:
            return jsonify(errno=RET.DBERR, errmsg='文件读取失败')
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='上传图片错误')

    # 将图片保存到用户模型并提交到数据库中
    g.user.avatar_url = image_name
    #  可以不写，因为已经设置自动提交
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='提交失败')

    return jsonify(errno=RET.OK, errmsg='操作成功', data={'avatar_url': constants.QINIU_DOMIN_PREFIX + image_name})


#  基本资料
"""
请求路径: /user/base_info
请求方式:GET,POST
请求参数:POST请求有参数,nick_name,signature,gender
返回值:errno,errmsg

"""""


@profile_blu.route('/base_info', methods=['GET', 'POST'])
@user_login_data
def base_info():
    #  如果是第一次进来，GET请求，直接返回页面即可
    if request.method == 'GET':
        return render_template('news/user_base_info.html', user_info=g.user.to_dict() if g.user else '')

    # 获取参数
    nick_name = request.json.get('nick_name')
    signature = request.json.get('signature')
    gender = request.json.get('gender')

    #  校验参数
    if not all([nick_name, signature, gender]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')

    # 判断gender数据是否在前端的定义的字符串里面
    if gender not in (['MAN', 'WOMAN']):
        return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

    # 更新并保存数据
    g.user.nick_name = nick_name
    g.user.signature = signature
    g.user.gender = gender

    try:
        #  提交到数据库
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

    # 将session中保存的数据实时更新
    session['nick_name'] = nick_name

    data = {
        'user_info': g.user.to_dict()
    }

    return jsonify(errno=RET.OK, errmsg='请求成功')


#  个人中心首页
@profile_blu.route('/info')
@user_login_data
def user_info():
    #  判断用户是否登陆
    if not g.user:
        return redirect('/')

    data = {
        'user_info': g.user.to_dict() if g.user else ''
    }
    return render_template('news/user.html', data=data)
